COMPILER=g++
LINKER=g++
OPTS = -c
PROTO_DIR = $(CURDIR)/../../proto
INCLUDE_DIR = $(CURDIR)/../../include
INCLUDE_HEADER = -I$(CURDIR)/../../include/ -I$(CURDIR)/../../proto/
BINARY = $(CURDIR)/../../bin/master
LIB = $(CURDIR)/../../lib

PROTOBUFLIB = `pkg-config --cflags --libs protobuf` -Wl,-rpath,$(LIB)
LDFLAGS = -Wall -g -O0 $(PROTOBUFLIB)
PROTOC = ../../bin/protoc

OBJS = main.o server.o master.o socket.o $(PROTO_DIR)/client_server.pb.o $(PROTO_DIR)/load.pb.o 

all: $(BINARY)

$(BINARY) : $(OBJS)
	pkg-config --cflags --libs protobuf
	$(LINKER) $(OBJS) -o $(BINARY) $(LDFLAGS) -lpthread

$(PROTO_DIR)/client_server_proto : $(PROTO_DIR)/client_server.proto
	$(PROTOC) -I=$(PROTO_DIR) --cpp_out=$(PROTO_DIR) $(PROTO_DIR)/client_server.proto
	pkg-config --cflags --libs protobuf
	$(COMPILER) $(OPTS) $(PROTO_DIR)/client_server.pb.cc $(LDFLAGS) -o $(PROTO_DIR)/client_server.pb.o
	@touch $(PROTO_DIR)/client_server_proto
	
$(PROTO_DIR)/load_proto : $(PROTO_DIR)/load.proto
	$(PROTOC) -I=$(PROTO_DIR) --cpp_out=$(PROTO_DIR) $(PROTO_DIR)/load.proto
	pkg-config --cflags --libs protobuf
	$(COMPILER) $(OPTS) $(PROTO_DIR)/load.pb.cc $(LDFLAGS) -o $(PROTO_DIR)/load.pb.o
	@touch $(PROTO_DIR)/load_proto
	
main.o : main.cpp $(INCLUDE_DIR)/master.h $(INCLUDE_DIR)/server.h $(INCLUDE_DIR)/socket.h $(PROTO_DIR)/client_server_proto $(PROTO_DIR)/load_proto
	$(COMPILER) $(OPTS) main.cpp $(INCLUDE_HEADER)

master.o : $(INCLUDE_DIR)/master.h $(INCLUDE_DIR)/server.h $(INCLUDE_DIR)/socket.h $(PROTO_DIR)/load_proto $(PROTO_DIR)/client_server_proto master.cpp 
	$(COMPILER) $(OPTS)  $(PROTO_DIR)/client_server.pb.cc $(PROTO_DIR)/load.pb.cc master.cpp $(INCLUDE_HEADER)

server.o : $(INCLUDE_DIR)/server.h $(INCLUDE_DIR)/socket.h ../server.cpp
	$(COMPILER) $(OPTS) ../server.cpp $(INCLUDE_HEADER) 

socket.o : $(INCLUDE_DIR)/socket.h ../socket.cpp
	$(COMPILER) $(OPTS) ../socket.cpp $(INCLUDE_HEADER)

clean :
	rm -rf *.o $(BINARY) $(PROTO_DIR)/client_server_proto $(PROTO_DIR)/load_proto
